package cn.iocoder.yudao.module.iot.gateway.protocol.custom.xiaoan.tcp.codec.parser.cmd;

import cn.hutool.core.map.MapUtil;
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
import cn.iocoder.yudao.module.iot.gateway.protocol.custom.xiaoan.tcp.codec.XiaoAnCmdTypeEnum;
import cn.iocoder.yudao.module.iot.gateway.protocol.custom.xiaoan.tcp.codec.parser.XiaoAnMessageParser;
import io.vertx.core.buffer.Buffer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 登录数据包，终端连接上服务器后，第一个发送的数据包必须是登录包，收到登录数据包的 回应后，才可以发送其他数据包；
 * 服务器收到设备的第一个数据包必须是登录数据包， 收到登陆包后，服务器记录该设备的会 话，并置设备状态为在线；
 * 如果设备没有登录，其他数据包一概丢弃。同时启动超时定时器， 如果设备在 10 分钟内没有任何数据上报，则将设备置为离线状态。
 */
@Component
@Slf4j
public class LoginMessageParser implements XiaoAnMessageParser {
    @Override
    public boolean supports(XiaoAnCmdTypeEnum cmd) {
        return XiaoAnCmdTypeEnum.LOGIN.equals(cmd);
    }

    @Override
    public IotDeviceMessage parse(Buffer buffer, int index, byte cmd, byte seq) {
        // 协议版本号，以该文档的修订版本为准，如 1.0.0 版本的协议号为 65536
        int version = buffer.getInt(index);
        index += 4;

        // 设备类型
        Integer deviceType = (int) buffer.getByte(index);
        index++;

        // 设备类型
        //char[] imei = buffer.getString(index, index + 15).toCharArray();
        String imei = buffer.getString(index, index + 15);
        index += 15;

        // 电源电压[V] 备注: 历史原因,部分设备没有这个字段
        Integer voltage = (int) buffer.getByte(index);
        index++;
        log.info("[parse][version: {}, deviceType: {}, imei: {}, voltage: {}]", version, deviceType, imei, voltage);
        return IotDeviceMessage.requestOf(String.valueOf(seq), String.valueOf(cmd),
                MapUtil.builder()
                        .put("imei", imei).put("deviceType", deviceType).put("voltage", voltage).put("version", version).build()
        );
    }
}
